// pin_map.h
#ifndef PIN_MAP_H
#define PIN_MAP_H

#include "stm32f10x.h"

#ifndef NULL
#define NULL ((void*)0)
#endif

// ====== GPIO 模式定义（用户接口）======
typedef enum {
    INPUT,              // 浮空输入
    INPUT_ANALOG,       // 模拟输入
    INPUT_PULLUP,       // 上拉输入
    INPUT_PULLDOWN,     // 下拉输入
    OUTPUT,             // 推挽输出
    OUTPUT_OD,          // 开漏输出
    OUTPUT_AF_PP,       // 复用推挽（如 PWM、I2C）
    OUTPUT_AF_OD        // 复用开漏（如 I2C）
} PinMode;

// ====== 引脚编号 ======
typedef enum {
    // PA0 - PA15
    GPIO_PIN_PA0  = 0,
    GPIO_PIN_PA1,
    GPIO_PIN_PA2,
    GPIO_PIN_PA3,
    GPIO_PIN_PA4,
    GPIO_PIN_PA5,
    GPIO_PIN_PA6,
    GPIO_PIN_PA7,
    GPIO_PIN_PA8,
    GPIO_PIN_PA9,
    GPIO_PIN_PA10,
    GPIO_PIN_PA11,
    GPIO_PIN_PA12,
    GPIO_PIN_PA13,
    GPIO_PIN_PA14,
    GPIO_PIN_PA15,

    // PB0 - PB15
    GPIO_PIN_PB0  = 16,
    GPIO_PIN_PB1,
    GPIO_PIN_PB2,
    GPIO_PIN_PB3,
    GPIO_PIN_PB4,
    GPIO_PIN_PB5,
    GPIO_PIN_PB6,
    GPIO_PIN_PB7,
    GPIO_PIN_PB8,
    GPIO_PIN_PB9,
    GPIO_PIN_PB10,
    GPIO_PIN_PB11,
    GPIO_PIN_PB12,
    GPIO_PIN_PB13,
    GPIO_PIN_PB14,
    GPIO_PIN_PB15,

    // PC0 - PC15
    GPIO_PIN_PC0  = 32,
    GPIO_PIN_PC1,
    GPIO_PIN_PC2,
    GPIO_PIN_PC3,
    GPIO_PIN_PC4,
    GPIO_PIN_PC5,
    GPIO_PIN_PC6,
    GPIO_PIN_PC7,
    GPIO_PIN_PC8,
    GPIO_PIN_PC9,
    GPIO_PIN_PC10,
    GPIO_PIN_PC11,
    GPIO_PIN_PC12,
    GPIO_PIN_PC13,
    GPIO_PIN_PC14,
    GPIO_PIN_PC15,

    // PD0 - PD15 (mostly for FSMC, but can be GPIO)
    GPIO_PIN_PD0  = 48,
    GPIO_PIN_PD1,
    GPIO_PIN_PD2,
    GPIO_PIN_PD3,
    GPIO_PIN_PD4,
    GPIO_PIN_PD5,
    GPIO_PIN_PD6,
    GPIO_PIN_PD7,
    GPIO_PIN_PD8,
    GPIO_PIN_PD9,
    GPIO_PIN_PD10,
    GPIO_PIN_PD11,
    GPIO_PIN_PD12,
    GPIO_PIN_PD13,
    GPIO_PIN_PD14,
    GPIO_PIN_PD15,
    // 未连接或保留
    GPIO_PIN_NONE = 0xFF
} GPIO_PinName;

// ====== 引脚映射结构 ======
typedef struct {
    GPIO_TypeDef *port;
    uint16_t      pin;
    uint8_t       is_pwm;
    TIM_TypeDef  *tim;
    uint16_t      channel;
    volatile uint16_t *ccr;
} PinMap;

void gpio_init_debug_pins_as_gpio(void);

// ====== 外部声明 ======
extern const PinMap pin_map[];
extern const int PIN_COUNT;

#endif
